import dayjs from 'dayjs'

// 邮箱
export function isEmail(s) {
    return /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+((.[a-zA-Z0-9_-]{2,3}){1,2})$/.test(s)
}

// 邮编
export function isPostcode(s) {
    return /^(0[1-7]|1[0-356]|2[0-7]|3[0-6]|4[0-7]|5[1-7]|6[1-7]|7[0-5]|8[013-6])\d{4}$/g.test(s)
}

// 手机号码
export function isPhone(s) {
    return /^1[3456789]\d{9}$/.test(s)
}

// 是否座机号码
export function isFixedphone(s) {
    return /^\d{3}-\d{8}|\d{4}-\d{7}$/g.test(s)
}

// URL地址
export function isURL(s) {
    return /^http[s]?:\/\/.*/.test(s)
}

// 身份证
export function isIdCard(s) {
    return /(^\d{15}$)|(^\d{18}$)|(^\d{17}(\d|X|x)$)/.test(s)
}

// 是否是移动端
export function isMobile() {
    var u = navigator.userAgent.toLowerCase()
    return !!u.match(/AppleWebKit.*Mobile.*/)
}

// 是否微信环境
export function isWX() {
    var u = navigator.userAgent.toLowerCase()
    return u.toLowerCase().indexOf('micromessenger') !== -1
}

// 特殊字符判断
export function isPatrn(s) {
    return /[`~!@#$%^&*_|+<>?"{}.\/;'[\]]/im.test(s)
}

// 是否是IP地址
export function isIp(s) {
    var res = /^(\d+)\.(\d+)\.(\d+)\.(\d+)$/ // 正则表达式
    if (res.test(s)) {
        if (RegExp.$1 < 256 && RegExp.$2 < 256 && RegExp.$3 < 256 && RegExp.$4 < 256) {
            return true
        }
    }
    return false
}

// 统一社会信用代码 (营业执照)
export function isLicense(s) {
    return /^[0-9A-HJ-NPQRTUWXY]{2}\d{6}[0-9A-HJ-NPQRTUWXY]{10}$/.test(s)
}

// 是否迅雷链接
export function isThunderLink(s) {
    return /^thunderx?:\/\/[a-zA-Z\d]+=$/g.test(s)
}

// 手机机身吗(IMEI)
export function isIMEI(s) {
    return /^\d{15,17}$/.test(s)
}

// 金额输入处理
export function limitFloat(val) {
    let sNum = val.toString() // 先转换成字符串类型
    if (sNum.indexOf('.') == 0) { // 第一位就是 .
        sNum = '0' + sNum
    }
    sNum = sNum.replace(/[^\d.]/g, "")  // 清除“数字”和“.”以外的字符
    sNum = sNum.replace(/\.{2,}/g, ".") // 只保留第一个. 清除多余的
    sNum = sNum.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".")
    sNum = sNum.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3') //只能输入两个小数
    // 以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
    if (sNum.indexOf(".") < 0 && sNum != "") {
        sNum = parseFloat(sNum);
    }
    return sNum
}

// 数组求和
export function sum(arr) {
    var s = 0
    for (var i = 0; i < arr.length; i++) {
      s += arr[i]
    }
    return s
}

// 密码强度
export function checkPwd(s) {
    var lvl = 0
    if (s.match(/[0-9]/)) {
        lvl++
    }
    if (s.match(/[a-zA-Z]/)) {
        lvl++
    }
    if (s.match(/[^0-9a-zA-Z]/)) {
        lvl++
    }
    if (s.length < 6) {
        lvl--
    }
    return lvl
}

// 库存状态
export function inventoryStatus(s) {
    var lvl = 'max'
    if (s > 30) {
        lvl = 'max'
    }
    if (s > 10 && s < 30) {
        lvl = 'mid'
    }
    if (s <= 10) {
        lvl = 'min'
    }
    if (s <= 0) {
        lvl = 'zero'
    }
    return lvl
}

// 库存状态
export function inventoryTxt(s) {
    var n = '库存充足'
    if (s > 30) {
        n = '库存充足'
    }
    if (s > 10 && s < 30) {
        n = '库存紧张'
    }
    if (s <= 10) {
        n = '库存不足'
    }
    if (s <= 0) {
        n = '暂无库存'
    }
    return n
}

// 兑奖状态
export function awardType(s) {
    var str = ''
    if (s == 2) {
        str = '您的中奖金额大于1万元，请到线下兑奖'
    }
    if (s == 3) {
        str = '您的彩票未中奖'
    }
    if (s == 4) {
        str = '票号和兑奖码不匹配'
    }
    if (s == 5) {
        str = '该彩票已兑奖请勿重复兑奖'
    }
    if (s == 6) {
        str = '票号不符合规则'
    }
    if (s == 7) {
        str = '不能跨区兑奖'
    }
    if (s > 7) {
        str = '未知状态'
    }
    return str
}

// 交易明细状态
export function transactionStatus(s) {
    var str = '待审批啊'
    if (s == 1) {
        str = '待审批啊'
    }
    if (s == 2) {
        str = '提现中啊'
    }
    if (s == 3) {
        str = '已审批啊'
    }
    if (s == 4) {
        str = '已完成啊'
    }
    return str
}

// 交易记录状态
export function recordStatus(s) {
    var str = ''
    if (s == 1) {
        str = '进行中'
    }
    if (s == 2) {
        str = '已完成'
    }
    return str
}

// 交易记录类型
export function recordType(s) {
    var str = ''
    if (s == 1) {
        str = '消费'
    }
    if (s == 2) {
        str = '充值'
    }
    if (s == 3) {
        str = '提现'
    }
    return str
}

// 优惠券状态
export function couponStatus(s) {
    var str = ''
    if (s == 0) {
        str = '待使用'
    }
    if (s == 1) {
        str = '已使用'
    }
    if (s == 2) {
        str = '已转赠'
    }
    if (s == 3) {
        str = '已过期'
    }
    return str
}

// 去掉数值前面的0
export function getNumber(s) {
    let n = (s.slice(-5)).slice(0,-2)
    return parseInt(n.replace(/\b(0+)/gi,""))
}

// 分转元
export function convertToYuan(val) {
    let amountInYuan = parseFloat((val / 100)).toFixed(2)
    return amountInYuan
}

// 获取指定范围内随机数
export function getRandomNumber(min, max) {
    let num = Math.floor(Math.random() * (max - min + 1)) + min
    return num
}

// 表情符号
export function isEmojo(s) {
    return /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/.test(s)
}

// 车牌号(新能源+非新能源)
export function isCarNumber(s) {
    return /^(([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z](([0-9]{5}[DF])|([DF]([A-HJ-NP-Z0-9])[0-9]{4})))|([京津沪渝冀豫云辽黑湘皖鲁新苏浙赣鄂桂甘晋蒙陕吉闽贵粤青藏川宁琼使领][A-Z][A-HJ-NP-Z0-9]{4}[A-HJ-NP-Z0-9挂学警港澳使领]))$/.test(s)
}

/**
 * 火车车次校验
  G—— 高铁
  D——动bai车组列车—du—简称：动车
  Z——直达特快旅客列车——简zhi称：直特
  T——特快dao旅客列车——简称：特
  K——快速旅客列车(跨局)——简称：快
  N——快速旅客列车(管内)——简称：内
  L——临时旅客列车(跨局)——简称：临
  A——临时旅客列车(管内)——简称：临A
  Y——旅游列车——简称：游
  X——行包专列——简称：行
 * */
export function isTrainNumber(s) {
    return /^(G|C|D|Z|S|T|K|D|X|P|L|\d{1})\d{1,4}$/.test(s)
}

// 转换日期为 YYYY-MM-DD HH:mm:ss 字符串
export function dateFormat(fmt, date) {
    return (() => dayjs(date).format(fmt))
}

// 统计数组中各个元素出现的次数
export function staArrNum(arr) {
    let obj = {}
    for (let i = 0; i < arr.length; i++) {
        let m = arr[i]
        if (obj.prototype.hasOwnProperty(m)) {
            obj[m] += 1
        } else {
            obj[m] = 1
        }
    }
    return obj
}

// 拼接url参数
export function joinUrlQuery(query = {}) {
    let queryStr = '?'
    Object.keys(query).forEach((key, idx) => {
        let joinChar = ''
        if (idx !== Object.keys(query).length - 1) {
            joinChar = '&'
        }

        queryStr += `${key}=${query[key]}${joinChar}`
    });
    return queryStr
}

// 获取url中参数
export function getParams(key) {
    let url = new URL(decodeURIComponent(window.location.href).replace(/#/gi, ''))
    return url.searchParams.get(key)
}

// 获取视口宽高尺寸
export function getViewportOffset() {
    if (window.innerWidth) {
        return {
            w: window.innerWidth,
            h: window.innerHeight
        }
    } else {
        // ie8及其以下
        if (document.compatMode === 'BackCompat') {
            // 怪异模式
            return {
                w: document.body.clientWidth,
                h: document.body.clientHeight
            }
        } else {
            // 标准模式
            return {
                w: document.documentElement.clientWidth,
                h: document.documentElement.clientHeight
            }
        }
    }
}

// 函数防抖
export function Debounce(func, waits, immediate) {
    let wait = waits || 500
    let timeout
    return function () {
        let context = this
        let args = arguments
        if (timeout) clearTimeout(timeout)
        if (immediate) {
            var callNow = !timeout
            timeout = setTimeout(() => {
                timeout = null
            }, wait)
            if (callNow) func.apply(context, args)
        } else {
            timeout = setTimeout(function () {
                func.apply(context, args)
            }, wait)
        }
    }
}

// 函数节流
export function Throttle(fn, t) {
    let last
    let timer
    let interval = t || 500
    return function () {
        let args = arguments
        let now = +new Date()
        if (last && now - last < interval) {
            clearTimeout(timer)
            timer = setTimeout(() => {
                last = now
                fn.apply(this, args)
            }, interval)
        } else {
            last = now
            fn.apply(this, args)
        }
    }
}

// 设置购物车数量
export function setGoodsNum(data) {
	$globalStore.useCommon.SET_GOODS_NUM(data);
};

// 判断是否还是一个对象
export function isObject(obj) {
	return Object.prototype.toString.call(obj) === "[object Object]";
}

// 扁平化对象
export function getObjKeys(obj) {
	let result = {}; // 用于保存扁平化后的对象
	const helpLoop = (obj) => {
		const objKeys = Object.keys(obj);
		for (let i = 0; i < objKeys.length; i++) {
			if (typeof obj[objKeys[i]] == "object") {
				helpLoop(obj[objKeys[i]]);
			} else {
				result[objKeys[i]] = obj[objKeys[i]];
			}
		}
	}
	helpLoop(obj)

	return result
}

// 比较两个对象差异
export function comparisonObject(objPre, objNext) {
	if (Object.keys(objPre).length == 0 || !objPre || !objNext) return false;
	const tempPre = getObjKeys(objPre);
	const tempNext = getObjKeys(objNext);
	// 数组去重
	let keys = [];
	keys.push(...Object.keys(tempPre));
	keys.push(...Object.keys(tempNext));
	keys = [...new Set(keys)];
	for (let i = 0; i < keys.length; i++) {
		if (tempPre[keys[i]] != tempNext[keys[i]]) {
			return keys[i];
		}
	}
	return false
}

/*
ele:要插入的元素（父元素要设置相对定位）
cloneEl：要克隆的元素
cssStyles：克隆时去掉不克隆的样式
*/
export function isElementHidden (ele = "", cloneEl = "", cssStyles = []) {
	if (!ele || !cloneEl) {
		return false
	}
	const clonedNode = cloneEl.cloneNode(true)
	const allStyle = cloneEl.computedStyleMap()
	for (const [prop, val] of allStyle) {
		if (!cssStyles.includes(prop)) {
			clonedNode.style[prop] = val
		}
	}
	clonedNode.className = ""
	clonedNode.style.visibility = "hidden"
	clonedNode.style.position = "absolute"
	clonedNode.setAttribute("id", "ellipt_hidden__node___id")
	ele.appendChild(clonedNode)
	const differ = clonedNode.offsetHeight > ele.offsetHeight
	ele.removeChild(clonedNode)
	return differ
}
